
var MongoClient = require('mongodb').MongoClient;
/**
 * 插入数据 单条数据
 * url      数据库地址
 * database 集合
 * curd     表名
 * data     插入数据 json格式   对象
 */
function inserts(url,database,curd,data){  //数据库地址 集合 表名
  // var url = "mongodb://localhost:27017/";
  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
      if (err) throw err;
      // var dbo = db.db("runoob");
      var dbo = db.db(database); //连接数据库
      // var myobj = { name: "菜鸟教程", url: "www.runoob" }; //要插入的数据
      var myobj = data //要插入的数据
      dbo.collection(curd).insertOne(myobj, function(err, res) { //文档插入 表中
          if (err) throw err;
          console.log("文档插入成功");
          db.close();
      });
  });

}
/**
 * 插入数据 多条数据
 * url      数据库地址
 * database 集合
 * curd     表名
 * data     插入数据 json格式   数组-对象
 */
function insertsData(url,database,curd,data){  //数据库地址 集合 表名
  // var url = "mongodb://localhost:27017/";

  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
      if (err) throw err;
      // var dbo = db.db("runoob");
      var dbo = db.db(database); //连接数据库 集合
      // var myobj = [
      //   { name: '菜鸟工具', url: 'https://c.runoob.com', type: 'cn'},
      //   { name: 'Google', url: 'https://www.google.com', type: 'en'},
      //   { name: 'Facebook', url: 'https://www.google.com', type: 'en'}
      //  ]; //要插入的数据
      var myobj = data //要插入的数据
      dbo.collection(curd).insertMany(myobj, function(err, res) { //文档插入 表中
          if (err) throw err;
          console.log("文档插入成功"+"插入的文档数量为: " + res.insertedCount);
          db.close();
      });
  });
}
/**
 * 查询数据
 * 可以使用 find() 来查找数据, find() 可以返回匹配条件的所有数据。 如果未指定条件，find() 返回集合中的所有数据。
 * 
 * url      数据库地址
 * database 集合
 * curd     表名
 * data     查询条件 json格式的对象
 */
function findData(url,database,curd,data){
  // var url = "mongodb://localhost:27017/";
  MongoClient.connect(url, { useNewUrlParser: true,useUnifiedTopology: true }, function(err, db) {
      if (err) throw err;
      var dbo = db.db(database);
      // var whereStr = {"name":'菜鸟教程'};  // 查询条件
      dbo.collection(curd).find(data).toArray(function(err, result) { // 返回集合中所有数据
          if (err) throw err;
          console.log('查询成功'+result);
          db.close();
      });
  });
}

/**
 * 更新数据  ------单条
 * 
 * url        数据库地址
 * database   集合
 * curd       表名
 * updateStr  更新的数据 json格式的对象
 * whereStr   查询条件
 */
function updateOne(url,database,curd,updateStr,whereStr){
  // var url = "mongodb://localhost:27017/";
 
  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
      if (err) throw err;
      var dbo = db.db(database);
      // var whereStr = {"name":'菜鸟教程'};  // 查询条件
      // var updateStr = {$set: { "url" : "https://www.runoob.com" }};
      dbo.collection(curd).updateOne(whereStr, updateStr,function(err, result) {
          if (err) throw err;
          console.log('文档更新成功'+result);
          db.close();
      });
  });
}

/**
 * 更新数据  ------多条
 * 
 * url        数据库地址
 * database   集合
 * curd       表名
 * updateStr  更新的数据 json格式的对象
 * whereStr   查询条件
 */
function updateMan(url,database,curd,updateStr,whereStr){
  // var url = "mongodb://localhost:27017/";
 
  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
      if (err) throw err;
      var dbo = db.db(database);
      // var whereStr = {"name":'菜鸟教程'};  // 查询条件
      // var updateStr = {$set: { "url" : "https://www.runoob.com" }};
      dbo.collection(curd).updateMany(whereStr, updateStr,function(err, result) {
          if (err) throw err;
          console.log(res.result.nModified + " 条文档被更新");
          db.close();
      });
  });
}

/**
 * 删除数据  ------一条
 * 
 * url        数据库地址
 * database   集合
 * curd       表名
 * whereStr   查询条件
 */
function deleteOnes(url,database,curd,whereStr){
  // var url = "mongodb://localhost:27017/";
 
  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
    if (err) throw err;
    var dbo = db.db(database);
    // var whereStr = {"name":'菜鸟教程'};  // 查询条件
    dbo.collection(curd).deleteOne(whereStr, function(err, obj) {
        if (err) throw err;
        console.log("文档删除成功"+obj);
        db.close();
    });
  });
}

/**
 * 删除数据  ------多条
 * 
 * url        数据库地址
 * database   集合
 * curd       表名
 * whereStr   查询条件
 */
function deleteManys(url,database,curd,whereStr){
  // var url = "mongodb://localhost:27017/";
 
  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
    if (err) throw err;
    var dbo = db.db(database);
    // var whereStr = {"name":'菜鸟教程'};  // 查询条件
    dbo.collection(curd).deleteMany(whereStr, function(err, obj) {
        if (err) throw err;
        console.log(obj.result.n + " 条文档被删除");
        db.close();
    });
  });
}

/**
 * 操作数据  ------排序
 * 
 * url        数据库地址
 * database   集合
 * curd       表名
 * mysort     排序规则
 * 
 * { type: 1 }  // 按 type 字段升序
 * { type: -1 } // 按 type 字段降序
 */
function sortData(url,database,curd,mysort){
  // var url = "mongodb://localhost:27017/";
 
  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
    if (err) throw err;
    var dbo = db.db(database);
    // var mysort = { type: 1 };
    dbo.collection(curd).find().sort(mysort).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
    });
  });
}

/**
 * 查询分页  -----
 * 
 * url        数据库地址
 * database   集合
 * curd       表名
 * 
 * limit(2)：读取两条数据
 * skip(2).limit(2): 跳过前面两条数据，读取两条数据
 */
function getPage(url,database,curd,limits,skips){
  // var url = "mongodb://localhost:27017/";
 
  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
    if (err) throw err;
    var dbo = db.db(database);
    dbo.collection(curd).find().skip(skips).limit(limits).toArray(function(err, result) {
        if (err) throw err;
        console.log(result);
        db.close();
  });
  });
}


/**
 * 表连接操作  -----
 * mongoDB 不是一个关系型数据库，但我们可以使用 $lookup 来实现左连接
 * 
 * url        数据库地址
 * database   集合
 * curd       表名
 * 
 * 
 */
function aggregates(url,database,curd){
  // var url = "mongodb://localhost:27017/";
 
  MongoClient.connect(url, { useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
    var dbo = db.db(database);
    dbo.collection(curd).aggregate([
      { $lookup:
         {
           from: 'products',            // 右集合
           localField: 'product_id',    // 左集合 join 字段
           foreignField: '_id',         // 右集合 join 字段
           as: 'orderdetails'           // 新生成字段（类型array）
         }
       }
      ]).toArray(function(err, res) {
      if (err) throw err;
      console.log(JSON.stringify(res));
      db.close();
    });
  });
}


/**
 * 删除集合  -----
 * mongoDB 不是一个关系型数据库，但我们可以使用 $lookup 来实现左连接
 * 
 * url        数据库地址
 * database   集合
 * curd       表名
 * 
 * 
 */
function deteleDrop(url,database,curd){
  // var url = "mongodb://localhost:27017/";
 
  MongoClient.connect(url,{ useNewUrlParser: true ,useUnifiedTopology: true}, function(err, db) {
    if (err) throw err;
    var dbo = db.db(database);
    // 删除 test 集合
    dbo.collection(curd).drop(function(err, delOK) {  // 执行成功 delOK 返回 true，否则返回 false
        if (err) throw err;
        if (delOK) console.log("集合已删除");
        db.close();
    });
  });
}

module.exports={inserts,insertsData,findData,updateOne,updateMan,deleteOnes,deleteManys,sortData,getPage,aggregates,deteleDrop}